package demoinnerclass;

//class OuterClass {
//    public int data1 = 1;//变量
//    private int data2 = 2;
//    static int data3 = 3;
//    static class InnerClass {//定义在类内的静态类
//        public int data4 = 4;
//        private int data5 = 5;
//        public static int data6 = 6;
//        public void test() {
//            OuterClass outerClass = new OuterClass();
//            System.out.println(outerClass.data1);
//            System.out.println(outerClass.data2);//非静态类 新建对象引用
//            System.out.println(data3);//本身就是静态无需间接调用
//            System.out.println(data4);//调用内部类
//            System.out.println(data5);
//            System.out.println(data6);
//        }
//    }
//    public void func() {//调用静态变量方法
//        InnerClass innerClass = new InnerClass();
//        innerClass.test();
//    }
//}

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;

//实例内部类
//class OuterClass {
//    public int data1 = 1;//变量
//    private int data2 = 2;
//    static int data3 = 3;
//     class InnerClass {//定义在类内的类 动态内部类
//         public int data1 = 1111;
//        public int data4 = 4;
//        private int data5 = 5;
//        public static final int data6 = 6;//static不依赖对象 无法创建变量 可用使用final解决
//        public void test() {//动态内部类方法
//            System.out.println(data1);//优先内部类
//            System.out.println(this.data1);//内部类
//            System.out.println(OuterClass.this.data1);//外部类名.this.变量调用外部
//            OuterClass outerClass = new OuterClass();//实例化对象调用
//            System.out.println(outerClass.data1);//
//            System.out.println(data2);
//            System.out.println(data3);
//            System.out.println(data4);
//            System.out.println(data5);
//            System.out.println(data6);
//            System.out.println("test()");
//        }
//    }
//    public void func() {//调用动态内部类
//        InnerClass innerClass = new InnerClass();
//        innerClass.test();
//    }
//}
//匿名内部类
interface InterFaceA {
    void func();
}
class InnerClass implements InterFaceA{
    @Override
    public void func() {
        System.out.println("哈哈哈哈~~~");
    }
}
public class Test {
    public void test() {
        class Best {//局部内部类 定义在方法中
            public void test() {
                System.out.println("test()");
            }
        }
        Best best = new Best();//局部内部类只能在方法内部实例化
        best.test();
    }
    public static void main(String[] args) {
        Test test = new Test();
        test.test();
        InnerClass innerClass = new InnerClass();//类实例化
        innerClass.func();
        System.out.println("---------------");
        InterFaceA a = new InterFaceA() {//新建类调用func方法
            @Override
            public void func() {
                  System.out.println("匿名内部类");
            }
        };
        a.func();
        new InterFaceA() {//新建类调用func方法
                    @Override
                    public void func() {
                        System.out.println("匿名内部类");
                    }
                }.func();//直接调用
    }
//    public static void main2(String[] args) {
//    OuterClass outerClass = new OuterClass();
//    //outerClass.func();
//        //创建动态内部类
//        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
//        //需要使用外部类.动态内部类实例化对象
//        innerClass.test();
//    }
//    public static void main1(String[] args) {
//        //静态内部类
//        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
//        innerClass.test();//间接创建调用静态方法
//    }
}
